@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: 物联网车辆管理系统 - 数据库部署脚本 (修复版本)
:: 版本: 1.1

echo ========================================
echo    物联网车辆管理系统 - 数据库部署
echo ========================================
echo.

:: 预检查环境
echo [INFO] 进行环境预检查...

:: 检查Docker和Docker Compose
echo [INFO] 检查Docker环境...
docker --version >nul 2>&1
if errorlevel 1 (
    echo [ERROR] Docker 未安装，请先安装 Docker Desktop
    echo [INFO] 下载地址: https://www.docker.com/products/docker-desktop
    goto :error_exit
)

docker-compose --version >nul 2>&1
if errorlevel 1 (
    echo [ERROR] Docker Compose 未安装，请先安装 Docker Compose
    goto :error_exit
)

:: 检查Docker服务状态
docker info >nul 2>&1
if errorlevel 1 (
    echo [ERROR] Docker 服务未运行，请启动 Docker Desktop
    goto :error_exit
)

echo [SUCCESS] Docker环境检查通过

:: 检查端口占用
echo [INFO] 检查端口占用...
netstat -ano | findstr :5432 >nul 2>&1
if not errorlevel 1 (
    echo [WARNING] 端口 5432 已被占用，尝试停止现有服务...
    docker-compose down >nul 2>&1
    
    :: 再次检查
    netstat -ano | findstr :5432 >nul 2>&1
    if not errorlevel 1 (
        echo [ERROR] 端口 5432 仍被其他程序占用，请手动停止占用该端口的程序
        netstat -ano | findstr :5432
        goto :error_exit
    )
)

:: 检查配置文件
echo [INFO] 检查配置文件...
if not exist "%~dp0docker-compose.yml" (
    echo [ERROR] docker-compose.yml 文件不存在
    goto :error_exit
)

if not exist "%~dp0init_database_postgresql.sql" (
    echo [ERROR] init_database_postgresql.sql 文件不存在
    goto :error_exit
)

if not exist "%~dp0postgresql.conf" (
    echo [ERROR] postgresql.conf 文件不存在
    goto :error_exit
)

:: 验证Docker Compose配置
echo [INFO] 验证配置文件语法...
docker-compose config >nul 2>&1
if errorlevel 1 (
    echo [ERROR] Docker Compose 配置文件语法错误
    docker-compose config
    goto :error_exit
)

echo [SUCCESS] 配置文件检查通过

:: 停止并清理现有服务
echo [INFO] 清理现有服务和数据...
docker-compose down -v >nul 2>&1
echo [SUCCESS] 环境清理完成

:: 拉取镜像
echo [INFO] 拉取所需的Docker镜像...
docker-compose pull
if errorlevel 1 (
    echo [ERROR] 镜像拉取失败，请检查网络连接
    echo [INFO] 如果网络较慢，可以尝试使用国内镜像源
    goto :error_exit
)
echo [SUCCESS] 镜像拉取完成

:: 启动服务
echo [INFO] 启动数据库服务...
docker-compose up -d
if errorlevel 1 (
    echo [ERROR] 服务启动失败
    echo [INFO] 查看详细错误信息:
    docker-compose logs
    goto :error_exit
)
echo [SUCCESS] 服务启动完成

:: 等待服务就绪
echo [INFO] 等待服务启动就绪...

:: 等待PostgreSQL启动
echo [INFO] 等待 PostgreSQL 启动...
set /a postgres_counter=0
:wait_postgres
docker-compose exec -T postgres pg_isready -h localhost -p 5432 >nul 2>&1
if errorlevel 1 (
    set /a postgres_counter+=1
    if !postgres_counter! GTR 60 (
        echo [ERROR] PostgreSQL 启动超时
        echo [INFO] 查看PostgreSQL日志:
        docker-compose logs postgres
        goto :error_exit
    )
    timeout /t 2 /nobreak >nul
    echo PostgreSQL 启动中... [!postgres_counter!/60]
    goto :wait_postgres
)
echo [SUCCESS] PostgreSQL 已就绪

:: 测试数据库连接和初始化
echo [INFO] 测试数据库连接...
docker-compose exec -T postgres psql -h localhost -U bicycle_user -d bicycle -c "SELECT 1;" >nul 2>&1
if errorlevel 1 (
    echo [ERROR] 数据库连接失败
    echo [INFO] 查看PostgreSQL日志:
    docker-compose logs postgres
    goto :error_exit
)
echo [SUCCESS] 数据库连接成功

:: 验证数据库初始化
echo [INFO] 验证数据库初始化...
docker-compose exec -T postgres psql -h localhost -U bicycle_user -d bicycle -c "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public';" >nul 2>&1
if errorlevel 1 (
    echo [WARNING] 数据库表未正确初始化
    echo [INFO] 尝试手动执行初始化脚本...
    docker-compose exec -T postgres psql -h localhost -U bicycle_user -d bicycle -f /docker-entrypoint-initdb.d/init_database.sql
    if errorlevel 1 (
        echo [ERROR] 数据库初始化失败
        goto :error_exit
    )
)
echo [SUCCESS] 数据库初始化完成

:: 等待Redis启动  
echo [INFO] 等待 Redis 启动...
set /a redis_counter=0
:wait_redis
docker-compose exec -T redis redis-cli ping 2>nul | findstr "PONG" >nul 2>&1
if errorlevel 1 (
    set /a redis_counter+=1
    if !redis_counter! GTR 30 (
        echo [ERROR] Redis 启动超时
        echo [INFO] 查看Redis日志:
        docker-compose logs redis
        goto :error_exit
    )
    timeout /t 2 /nobreak >nul
    echo Redis 启动中... [!redis_counter!/30]
    goto :wait_redis
)
echo [SUCCESS] Redis 已就绪

:: 等待EMQX启动
echo [INFO] 等待 EMQX 启动...
set /a emqx_counter=0
:wait_emqx
curl -s http://localhost:18083 >nul 2>&1
if errorlevel 1 (
    set /a emqx_counter+=1
    if !emqx_counter! GTR 30 (
        echo [WARNING] EMQX 启动超时，但可能仍在启动中
        echo [INFO] 可以稍后通过 http://localhost:18083 访问EMQX管理界面
        goto :skip_emqx
    )
    timeout /t 2 /nobreak >nul
    echo EMQX 启动中... [!emqx_counter!/30]
    goto :wait_emqx
)
echo [SUCCESS] EMQX 已就绪
:skip_emqx

:: 显示服务状态
echo.
echo ========================================
echo [SUCCESS] 数据库环境部署完成！
echo ========================================
echo.

echo [INFO] 服务状态:
docker-compose ps

echo.
echo [INFO] 服务访问地址:
echo   PostgreSQL: localhost:5432
echo     - 用户名: bicycle_user
echo     - 密码: bicycle123
echo     - 数据库: bicycle
echo.
echo   Redis: localhost:6379
echo.
echo   MQTT Broker: localhost:1883
echo     - WebSocket: ws://localhost:8083/mqtt
echo     - 用户名: emqx
echo     - 密码: public
echo.
echo   管理工具:
echo     - pgAdmin: http://localhost:8090
echo       (邮箱: admin@admin.com, 密码: admin)
echo     - Redis Commander: http://localhost:8081
echo     - EMQX Dashboard: http://localhost:18083
echo       (用户名: admin, 密码: public)
echo.

echo [INFO] 默认用户账号:
echo   管理员: admin / admin123
echo   测试用户: testuser / admin123
echo.

echo [INFO] 数据库部署完成！可以继续后续的后端服务部署
echo 按任意键退出...
pause >nul
exit /b 0

:error_exit
echo.
echo ========================================
echo [ERROR] 部署失败！
echo ========================================
echo.
echo [INFO] 常见问题解决方案:
echo 1. 确保Docker Desktop已启动并正在运行
echo 2. 检查系统防火墙设置
echo 3. 确保端口5432、6379、1883、8080、8081、18083未被占用
echo 4. 检查磁盘空间是否充足
echo 5. 尝试重启Docker Desktop
echo 6. 如果问题持续，请运行 diagnose_postgresql.bat 进行详细诊断
echo.
echo 按任意键退出...
pause >nul
exit /b 1 